diff --git a/DataFixtures/ORM/LoadCenters.php b/DataFixtures/ORM/LoadCenters.php index e1a7f0873..d0bb7178f 100644 --- a/DataFixtures/ORM/LoadCenters.php +++ b/DataFixtures/ORM/LoadCenters.php @@ -39,21 +39,30 @@ class LoadCenters extends AbstractFixture implements OrderedFixtureInterface return 100; } + public static $centers = array( + array( + 'name' => 'Center A', + 'ref' => 'centerA' + ), + array( + 'name' => 'Center B', + 'ref' => 'centerB' + ) + ); + + public static $refs = array(); + public function load(ObjectManager $manager) { - $centerA = new Center(); - $centerA->setName('Center A'); - - $manager->persist($centerA); - $this->addReference('centerA', $centerA); - - $centerB = new Center(); - $centerB->setName('center B'); - - $manager->persist($centerB); - $this->addReference('centerB', $centerB); + foreach (static::$centers as $new) { + $centerA = new Center(); + $centerA->setName($new['name']); + + $manager->persist($centerA); + $this->addReference($new['ref'], $centerA); + static::$refs[] = $new['ref']; + } $manager->flush(); - } } diff --git a/DataFixtures/ORM/LoadGroupCenters.php b/DataFixtures/ORM/LoadGroupCenters.php new file mode 100644 index 000000000..04a34d080 --- /dev/null +++ b/DataFixtures/ORM/LoadGroupCenters.php @@ -0,0 +1,63 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\MainBundle\DataFixtures\ORM; + +use Doctrine\Common\DataFixtures\AbstractFixture; +use Doctrine\Common\DataFixtures\OrderedFixtureInterface; +use Doctrine\Common\Persistence\ObjectManager; +use Chill\MainBundle\Entity\GroupCenter; +use Chill\MainBundle\DataFixtures\ORM\LoadCenters; +use Chill\MainBundle\DataFixtures\ORM\LoadPermissionsGroup; + +/** + * + * + * @author Julien Fastré + */ +class LoadGroupCenters extends AbstractFixture implements OrderedFixtureInterface +{ + public function getOrder() + { + return 500; + } + + public static $refs = array(); + + public function load(ObjectManager $manager) + { + foreach (LoadCenters::$refs as $centerRef) { + foreach (LoadPermissionsGroup::$refs as $permissionGroupRef) { + $GroupCenter = new GroupCenter(); + $GroupCenter->setCenter($this->getReference($centerRef)); + $GroupCenter->addPermissionGroup($this->getReference($permissionGroupRef)); + + $manager->persist($GroupCenter); + + $reference = $centerRef.'_'.$permissionGroupRef; + $this->addReference($reference, $GroupCenter); + static::$refs[] = $reference; + echo "Creating $reference... \n"; + } + } + + $manager->flush(); + } +} diff --git a/DataFixtures/ORM/LoadPermissionsGroup.php b/DataFixtures/ORM/LoadPermissionsGroup.php new file mode 100644 index 000000000..b2ed78934 --- /dev/null +++ b/DataFixtures/ORM/LoadPermissionsGroup.php @@ -0,0 +1,87 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\MainBundle\DataFixtures\ORM; + +use Doctrine\Common\DataFixtures\AbstractFixture; +use Doctrine\Common\DataFixtures\OrderedFixtureInterface; +use Doctrine\Common\Persistence\ObjectManager; +use Chill\MainBundle\Entity\PermissionsGroup; + +/** + * + * + * @author Julien Fastré + */ +class LoadPermissionsGroup extends AbstractFixture implements OrderedFixtureInterface +{ + public function getOrder() + { + return 400; + } + + public static $permissionGroup = array( + array( + 'name' => 'social', + 'role_scopes' => array( + 'role_scope_CHILL_FOO_EDIT_social', + 'role_scope_CHILL_FOO_SEE_administrative', + "role_scope_CHILL_FOO_EDIT_all" + ) + ), + array( + 'name' => 'administrative', + 'role_scopes' => array( + "role_scope_CHILL_FOO_SEE_social", + "role_scope_CHILL_FOO_EDIT_administrative", + "role_scope_CHILL_FOO_EDIT_all" + ) + ), + array( + 'name' => 'direction', + 'role_scopes' => array( + "role_scope_CHILL_FOO_EDIT_all", + "role_scope_CHILL_FOO_SEE_DETAILS_social", + "role_scope_CHILL_FOO_SEE_DETAILS_administrative" + ) + ) + ); + + public static $refs = array(); + + public function load(ObjectManager $manager) + { + foreach (static::$permissionGroup as $new) { + $permissionGroup = new PermissionsGroup(); + $permissionGroup->setName($new['name']); + foreach ($new['role_scopes'] as $roleScopeRef) { + $permissionGroup->addRoleScope($this->getReference($roleScopeRef)); + } + + $manager->persist($permissionGroup); + $reference = 'permission_group_'.$new['name']; + echo "Creating $reference \n"; + $this->setReference($reference, $permissionGroup); + static::$refs[] = $reference; + } + + $manager->flush(); + } +} diff --git a/DataFixtures/ORM/LoadRoleScopes.php b/DataFixtures/ORM/LoadRoleScopes.php index a6330bcb9..9693576d6 100644 --- a/DataFixtures/ORM/LoadRoleScopes.php +++ b/DataFixtures/ORM/LoadRoleScopes.php @@ -46,6 +46,13 @@ class LoadRoleScopes extends AbstractFixture implements OrderedFixtureInterface 'nl' => 'zie foo' ) ), + 'CHILL_FOO_SEE_DETAILS' => array( + 'names' => array( + 'fr' => 'voir foo avec détails', + 'en' => 'see foo with details', + 'nl' => 'zie foo in details' + ) + ), 'CHILL_FOO_EDIT' => array( 'names' => array( 'fr' => 'modifier foo', @@ -66,7 +73,7 @@ class LoadRoleScopes extends AbstractFixture implements OrderedFixtureInterface ->setScope($this->getReference($scopeReference)) ; $reference = 'role_scope_'.$key.'_'.$this->getReference($scopeReference)->getName()['en']; - var_dump($reference); + echo "Creating $reference \n"; $this->addReference($reference, $roleScope); $manager->persist($roleScope); static::$references[] = $reference; diff --git a/DataFixtures/ORM/LoadUsers.php b/DataFixtures/ORM/LoadUsers.php index 222b8d03d..df5ca2100 100644 --- a/DataFixtures/ORM/LoadUsers.php +++ b/DataFixtures/ORM/LoadUsers.php @@ -7,15 +7,20 @@ use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ContainerAwareInterface; +use Chill\MainBundle\DataFixtures\ORM\LoadCenters; +use Chill\MainBundle\DataFixtures\ORM\LoadPermissionsGroup; +use Chill\MainBundle\Entity\User; /** - * Load agents into database + * Load fixtures users into database + * + * create a user for each permission_group and center. + * username and password are identicals. * * @author Julien Fastré */ -class LoadUsers extends AbstractFixture implements ContainerAwareInterface +class LoadUsers extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface { - /** * * @var ContainerInterface @@ -26,15 +31,42 @@ class LoadUsers extends AbstractFixture implements ContainerAwareInterface { return 1000; } - - public function setContainer(ContainerInterface $container = null) - { - $this->container = $container; - } + + public static $refs = array(); public function load(ObjectManager $manager) { + foreach(LoadCenters::$refs as $centerRef) { + foreach(LoadPermissionsGroup::$refs as $permissionGroupRef) { + $user = new User(); + + $permissionGroup = $this->getReference($permissionGroupRef); + $center = $this->getReference($centerRef); + $username = $center->getName().'_'.$permissionGroup->getName(); + + $user->setUsername($username) + ->setPassword($this->container->get('security.encoder_factory') + ->getEncoder($user) + ->encodePassword($username, $user->getSalt())); + $user->addGroupCenter($this->getReference($centerRef.'_'.$permissionGroupRef)); + + $manager->persist($user); + $this->addReference($username, $user); + static::$refs[] = $user->getUsername(); + echo "Creating user with username ".$user->getUsername()."... \n"; + } + } + $manager->flush(); + } + + public function setContainer(ContainerInterface $container = null) + { + if (NULL === $container) { + throw new \LogicException('$container should not be null'); + } + + $this->container = $container; } } diff --git a/Entity/Center.php b/Entity/Center.php index 75edd18c4..fddb54441 100644 --- a/Entity/Center.php +++ b/Entity/Center.php @@ -39,6 +39,17 @@ class Center */ private $id; + /** + * + * @var \Doctrine\Common\Collections\Collection + */ + private $groupCenters; + + public function __construct() + { + $this->groupCenters = new \Doctrine\Common\Collections\ArrayCollection(); + } + public function getName() { return $this->name; @@ -54,6 +65,17 @@ class Center { return $this->id; } + + public function getGroupCenters() + { + return $this->groupCenters; + } + + public function addGroupCenter(GroupCenter $groupCenter) + { + $this->groupCenters->add($groupCenter); + return $this; + } } diff --git a/Entity/GroupCenter.php b/Entity/GroupCenter.php new file mode 100644 index 000000000..d882ab526 --- /dev/null +++ b/Entity/GroupCenter.php @@ -0,0 +1,118 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace Chill\MainBundle\Entity; + +use Chill\MainBundle\Entity\Center; +use Chill\MainBundle\Entity\PermissionsGroup; +use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\ArrayCollection; + +/** + * + * + * @author Julien Fastré + */ +class GroupCenter +{ + /** + * + * @var int + */ + private $id; + + /** + * + * @var Center + */ + private $center; + + /** + * + * @var Collection + */ + private $users; + + /** + * + * @var Collection + */ + private $permissionGroups; + + public function __construct() + { + $this->permissionGroups = new ArrayCollection(); + $this->users = new ArrayCollection(); + } + + public function getId() + { + return $this->id; + } + + /** + * + * @return Center + */ + public function getCenter() + { + return $this->center; + } + + /** + * + * @return PermissionGroup[] + */ + public function getPermissionGroups() + { + return $this->permissionGroups; + } + + /** + * + * @param Center $center + * @return \Chill\MainBundle\Entity\GroupCenter + */ + public function setCenter(Center $center) + { + $this->center = $center; + return $this; + } + + /** + * + * @param PermissionGroup $permission + * @return \Chill\MainBundle\Entity\GroupCenter + */ + public function addPermissionGroup(PermissionsGroup $permission) + { + $this->permissionGroups->add($permission); + return $this; + } + + public function getUsers() + { + return $this->users; + } + + + + +} diff --git a/Entity/PermissionGroup.php b/Entity/PermissionsGroup.php similarity index 93% rename from Entity/PermissionGroup.php rename to Entity/PermissionsGroup.php index cf2b76b05..c3f78fcb0 100644 --- a/Entity/PermissionGroup.php +++ b/Entity/PermissionsGroup.php @@ -29,7 +29,7 @@ use Chill\MainBundle\Entity\RoleScope; * * @author Julien Fastré */ -class PermissionGroup +class PermissionsGroup { /** * @@ -39,7 +39,7 @@ class PermissionGroup /** * - * @var array + * @var string */ private $name; @@ -59,6 +59,10 @@ class PermissionGroup return $this->id; } + /** + * + * @return string + */ public function getName() { return $this->name; @@ -69,7 +73,7 @@ class PermissionGroup return $this->roleScopes; } - public function setName(array $name) + public function setName($name) { $this->name = $name; return $this; diff --git a/Entity/User.php b/Entity/User.php index 1eeac1060..76c3f4316 100644 --- a/Entity/User.php +++ b/Entity/User.php @@ -2,14 +2,14 @@ namespace Chill\MainBundle\Entity; - -use Doctrine\ORM\Mapping as ORM; -use Symfony\Component\Security\Core\User\UserInterface; +use Symfony\Component\Security\Core\User\AdvancedUserInterface; +use Doctrine\Common\Collections\Collection; +use Doctrine\Common\Collections\ArrayCollection; /** * User */ -class User implements UserInterface { +class User implements AdvancedUserInterface { /** * @var integer @@ -21,14 +21,43 @@ class User implements UserInterface { */ private $username; + /** + * + * @var string + */ private $password; - private $salt; + /** + * + * @var string + * @internal must be set to null if we use bcrypt + */ + private $salt = null; + + /** + * + * @var boolean + */ + private $locked = false; + + /** + * + * @var boolean + */ + private $enabled = true; + + /** + * + * @var Collection + */ + private $groupCenters; + + public function __construct() + { + $this->groupCenters = new ArrayCollection(); + } - - - /** * Get id * @@ -51,16 +80,6 @@ class User implements UserInterface { return $this; } - - /** - * Get name - * - * @return string - */ - public function getName() - { - return $this->username; - } public function __toString() { return $this->getUsername(); @@ -71,6 +90,10 @@ class User implements UserInterface { } + /** + * + * @return string + */ public function getPassword() { return $this->password; @@ -93,7 +116,7 @@ class User implements UserInterface { function setPassword($password) { - $this->password = $password; + $this->password = $password; return $this; } @@ -103,6 +126,63 @@ class User implements UserInterface { return $this; } + /** + * {@inheritdoc} + * + * @return boolean + */ + public function isAccountNonExpired() + { + return false; + } + /** + * {@inheritdoc} + * + */ + public function isAccountNonLocked() + { + return $this->locked; + } + + /** + * {@inheritdoc} + * + * @return boolean + */ + public function isCredentialsNonExpired() + { + return true; + } + + /** + * {@inheritdoc} + * + * @return boolean + */ + public function isEnabled() + { + return $this->enabled; + } + + /** + * + * @return GroupCenter[] + */ + public function getGroupCenters() + { + return $this->groupCenters; + } + + /** + * + * @param \Chill\MainBundle\Entity\GroupCenter $groupCenter + * @return \Chill\MainBundle\Entity\User + */ + public function addGroupCenter(GroupCenter $groupCenter) + { + $this->groupCenters->add($groupCenter); + return $this; + } } diff --git a/Resources/config/doctrine/Center.orm.yml b/Resources/config/doctrine/Center.orm.yml index 491495faf..8ac4355cc 100644 --- a/Resources/config/doctrine/Center.orm.yml +++ b/Resources/config/doctrine/Center.orm.yml @@ -10,4 +10,8 @@ Chill\MainBundle\Entity\Center: fields: name: type: string - length: 255 \ No newline at end of file + length: 255 + oneToMany: + groupCenters: + targetEntity: Chill\MainBundle\Entity\GroupCenter + mappedBy: groupCenters \ No newline at end of file diff --git a/Resources/config/doctrine/GroupCenter.orm.yml b/Resources/config/doctrine/GroupCenter.orm.yml new file mode 100644 index 000000000..37a7a81f5 --- /dev/null +++ b/Resources/config/doctrine/GroupCenter.orm.yml @@ -0,0 +1,16 @@ +Chill\MainBundle\Entity\GroupCenter: + type: entity + table: group_centers + id: + id: + type: integer + id: true + generator: + strategy: AUTO + manyToOne: + center: + targetEntity: Chill\MainBundle\Entity\Center + inversedBy: groupCenters + manyToMany: + permissionGroups: + targetEntity: Chill\MainBundle\Entity\PermissionsGroup \ No newline at end of file diff --git a/Resources/config/doctrine/PermissionGroup.orm.yml b/Resources/config/doctrine/PermissionsGroup.orm.yml similarity index 76% rename from Resources/config/doctrine/PermissionGroup.orm.yml rename to Resources/config/doctrine/PermissionsGroup.orm.yml index f7c7de5ec..c0ebe69fc 100644 --- a/Resources/config/doctrine/PermissionGroup.orm.yml +++ b/Resources/config/doctrine/PermissionsGroup.orm.yml @@ -1,4 +1,4 @@ -Chill\MainBundle\Entity\PermissionGroup: +Chill\MainBundle\Entity\PermissionsGroup: type: entity table: permission_groups id: @@ -9,7 +9,8 @@ Chill\MainBundle\Entity\PermissionGroup: strategy: AUTO fields: name: - type: json_array + type: string + length: 255 manyToMany: roleScopes: targetEntity: Chill\MainBundle\Entity\RoleScope diff --git a/Resources/config/doctrine/RoleScope.orm.yml b/Resources/config/doctrine/RoleScope.orm.yml index 32ecd4f86..4ab688b7b 100644 --- a/Resources/config/doctrine/RoleScope.orm.yml +++ b/Resources/config/doctrine/RoleScope.orm.yml @@ -11,7 +11,7 @@ Chill\MainBundle\Entity\RoleScope: role: type: string length: 255 - oneToMany: + manyToOne: scope: targetEntity: Chill\MainBundle\Entity\Scope - mappedBy: roleScopes \ No newline at end of file + inversedBy: roleScopes \ No newline at end of file diff --git a/Resources/config/doctrine/User.orm.yml b/Resources/config/doctrine/User.orm.yml index 7edb8230a..924b85ac1 100644 --- a/Resources/config/doctrine/User.orm.yml +++ b/Resources/config/doctrine/User.orm.yml @@ -17,5 +17,15 @@ Chill\MainBundle\Entity\User: salt: type: string length: 255 + nullable: true + enabled: + type: boolean + default: true + locked: + type: boolean + default: false + manyToMany: + groupCenters: + targetEntity: Chill\MainBundle\Entity\GroupCenter