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:
Julien Fastré 2018-09-07 16:24:36 +02:00
parent b1ae55ba80
commit b9a7314975
12 changed files with 160 additions and 2 deletions

View File

@ -12,6 +12,7 @@ use Chill\MainBundle\DependencyInjection\CompilerPass\ExportsCompilerPass;
use Chill\MainBundle\DependencyInjection\CompilerPass\WidgetsCompilerPass;
use Chill\MainBundle\DependencyInjection\CompilerPass\NotificationCounterCompilerPass;
use Chill\MainBundle\DependencyInjection\CompilerPass\MenuCompilerPass;
use Chill\MainBundle\DependencyInjection\CompilerPass\ACLFlagsCompilerPass;
class ChillMainBundle extends Bundle
@ -27,5 +28,6 @@ class ChillMainBundle extends Bundle
$container->addCompilerPass(new WidgetsCompilerPass());
$container->addCompilerPass(new NotificationCounterCompilerPass());
$container->addCompilerPass(new MenuCompilerPass());
$container->addCompilerPass(new ACLFlagsCompilerPass());
}
}

View 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)
);
}
}
}
}
}

View File

@ -58,7 +58,7 @@ class GroupCenter
public function __construct()
{
$this->permissionGroups = new ArrayCollection();
$this->permissionsGroup = new ArrayCollection();
$this->users = new ArrayCollection();
}

View File

@ -43,6 +43,12 @@ class PermissionsGroup
*/
private $name;
/**
*
* @var string[]
*/
private $flags = [];
/**
*
* @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
*

View File

@ -5,9 +5,20 @@ namespace Chill\MainBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
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
{
/**
*
* @var PermissionsGroupFlagProvider[]
*/
protected $flagProviders = [];
const FLAG_SCOPE = 'permissions_group';
/**
* @param FormBuilderInterface $builder
* @param array $options
@ -15,8 +26,40 @@ class PermissionsGroupType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$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;
}
/**

View 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;
}

View File

@ -14,6 +14,10 @@ Chill\MainBundle\Entity\PermissionsGroup:
name:
type: string
length: 255
flags:
type: json
options:
default: '[]'
manyToMany:
roleScopes:
targetEntity: Chill\MainBundle\Entity\RoleScope

View File

@ -33,6 +33,7 @@ services:
- "@doctrine.orm.entity_manager"
tags:
- { name: form.type, alias: select2_chill_language }
chill.main.form.type.center:
class: Chill\MainBundle\Form\Type\CenterType
arguments:
@ -130,5 +131,9 @@ services:
arguments:
$chillLogger: '@monolog.logger.chill'
$passwordEncoder: '@Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface'
tags:
- { name: form.type }
Chill\MainBundle\Form\PermissionsGroupType:
tags:
- { name: form.type }

View 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');
}
}

View File

@ -129,6 +129,7 @@ Edit password for %username%: Éditer le mot de passe de %username%
Change password: Changer le mot de passe
Back to the user edition: Retour au formulaire d'édition
Password successfully updated!: Mot de passe mis à jour
Flags: Drapeaux
#admin section for circles (old: scopes)
List circles: Liste des cercles

View File

@ -9,6 +9,7 @@
{{ form_start(edit_form) }}
{{ form_row(edit_form.name) }}
{{ form_row(edit_form.flags) }}
{{ form_row(edit_form.submit, { 'attr': { 'class': 'sc-button green' } } ) }}
{{ form_end(edit_form) }}

View File

@ -7,6 +7,7 @@
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.flags) }}
{{ form_row(form.submit, { 'attr': { 'class': 'sc-button green' } } ) }}
{{ form_end(form) }}