Commit f4f7db0f authored by Sebastian Castro's avatar Sebastian Castro

Improving roles management

parent e1509908
v2.3.4
======
* FEATURE: Complete reorganisation of user role management. Please update your users & groups roles
* FEATURE: Element import, ability to map ontology and taxonomy
* BUG: Fix list mode
......
......@@ -197,9 +197,11 @@
{% block side_bar_after_nav %}
{# CUSTOM Menu #}
<ul class="sidebar-menu">
<li class="first treeview">
<a href="{{ path('biopen_bulk_actions_index') }}"><i class="fa fa-bullhorn"></i><span>Actions de masse</span></a>
</li>
{% if is_granted("ROLE_ADMIN") or is_granted("ROLE_SUPER_ADMIN") %}
<li class="first treeview">
<a href="{{ path('biopen_bulk_actions_index') }}"><i class="fa fa-bullhorn"></i><span>Actions de masse</span></a>
</li>
{% endif %}
<li>
<a href="{{ path('biopen_core_help') }}"><i class="fa fa-question"></i><span>Aide</span></a>
</li>
......
......@@ -5,8 +5,8 @@ sonata_block:
sonata.user.block.account: # used to display menu option (login option)
sonata.block.service.text: # used to if you plan to use Sonata user routes
# enable the SonataAdminBundle block
sonata.block.service.monitoring:
sonata.block.service.charts:
sonata.block.service.monitoring:
sonata.block.service.charts:
biopen.block.recent_elements:
contexts: [admin]
......@@ -55,7 +55,14 @@ sonata_formatter:
sonata_admin:
security:
handler: sonata.admin.security.handler.role
handler: custom.sonata.security.handler.role # sonata.admin.security.handler.role
information:
LIST: LIST
CREATE: CREATE
EDIT: EDIT
DELETE: DELETE
EXPORT: EXPORT
options:
confirm_exit: false
templates:
......@@ -71,16 +78,16 @@ sonata_admin:
- { position: top, class: col-md-12, type: sonata.block.service.charts}
groups:
Contenus:
icon: <i class='fa fa-file-text'></i>
icon: <i class='fa fa-file-text'></i>
data:
label: "Données"
icon: <i class='fa fa-database'></i>
icon: <i class='fa fa-database'></i>
custom:
label: Personnalisation
icon: <i class='fa fa-paint-brush'></i>
data_model:
label: Modèle de donnée
icon: <i class='fa fa-database'></i>
icon: <i class='fa fa-database'></i>
emailing:
label: Mails / Newsletter
icon: <i class='fa fa-envelope'></i>
......
......@@ -8,11 +8,12 @@ security:
acl:
connection: default
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_DIRECTMODERATION_ADD, ROLE_DIRECTMODERATION_EDIT_OWN_CONTRIB]
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
SONATA:
- ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT # if you are using acl then this line must be commented
role_hierarchy:
ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_SONATA_ADMIN, ROLE_DIRECTMODERATION_ADD, ROLE_DIRECTMODERATION_EDIT_OWN_CONTRIB]
ROLE_ADMIN: [ROLE_DIRECTMODERATION_ADD, ROLE_DIRECTMODERATION_EDIT_OWN_CONTRIB, ROLE_ADMIN_ELEMENTS_LIST, ROLE_ADMIN_ELEMENTS_CREATE, ROLE_ADMIN_ELEMENTS_EDIT, ROLE_ADMIN_ELEMENTS_DELETE, ROLE_ADMIN_ELEMENTS_EXPORT]
ROLE_SONATA_ADMIN: []
ROLE_DIRECTMODERATION_ADD: []
ROLE_DIRECTMODERATION_EDIT_OWN_CONTRIB: []
providers:
fos_userbundle:
......@@ -50,10 +51,10 @@ security:
default_target_path: biopen_homepage
use_referer: true
check_path: /login_check
failure_path: /login
failure_path: /login
success_handler: biopen.authentication_handler
failure_handler: biopen.authentication_handler
logout:
logout:
path: /logout
success_handler: biopen.authentication_handler
anonymous: ~
......@@ -90,6 +91,7 @@ security:
# Secured part of the site
# This config requires being logged for the whole site and having the admin role for the admin part.
# Change these rules to adapt them to your needs
- { path: ^/admin/bulkActions/, role: [ROLE_ADMIN] }
- { path: ^/admin/, role: [ROLE_SONATA_ADMIN] }
- { path: ^/user/, role: IS_AUTHENTICATED_REMEMBERED }
- { path: ^/duplicates/, role: [ROLE_ADMIN] }
......
......@@ -4,7 +4,7 @@ services:
jms_serializer.naming_strategy:
class: 'JMS\Serializer\Naming\SerializedNameAnnotationStrategy'
arguments : ['@jms_serializer.naming_strategy_camelCase']
arguments : ['@jms_serializer.naming_strategy_camelCase']
jms_serializer.expression_language:
class: 'Symfony\Component\ExpressionLanguage\ExpressionLanguage'
......@@ -18,4 +18,10 @@ services:
public: false
arguments: [ "@doctrine.odm.mongoDB.document_manager" ]
tags:
- { name: twig.extension }
\ No newline at end of file
- { name: twig.extension }
custom.sonata.security.handler.role:
class: Application\Sonata\UserBundle\Security\CustomRoleSecurityHandler
arguments:
- @security.authorization_checker
- [ROLE_SUPER_ADMIN]
\ No newline at end of file
{#
This file is part of the Sonata package.
(c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.
#}
{% block sonata_security_roles_widget %}
{% spaceless %}
<div class="editable">
{% set object = form.vars.sonata_admin.admin.subject %}
<div class="role-group">
<h4 class="role-group-title main-roles">Roles Principaux</h4>
{% set mainRoles = {
'ROLE_SUPER_ADMIN': 'SUPER ADMIN (tous les pouvoirs)',
'ROLE_ADMIN': "MODERATEUR (Accès aux fonctions de modérations, à détailler dans ModèleDeDonnées/QuiPeutContribuer)",
'ROLE_DIRECTMODERATION_ADD': "CONTRIBUTEUR + (peut ajouter des éléments comme un Admin depuis le site)",
'ROLE_DIRECTMODERATION_EDIT_OWN_CONTRIB': "CONTRIBUTEUR + (peut éditer les éléments auquel il a contribué, même sans être propriétaire)",
'ROLE_SONATA_ADMIN': "INTERFACE ADMINISTRATEUR"
}%}
{% for role, label in mainRoles %}
<div class="checkbox role-checkbox {{ role }}">
<label>
<input type="checkbox" name="{{form.vars.full_name}}[]" value="{{role}}"
{{ role in object.roles ? 'checked' : '' }}
{{ is_granted(role) ? '' : 'disabled'}}>
<span class="control-label__text">{{ label }}</span>
</label>
</div>
{% endfor %}
</div>
<div class="admin-config">
<p>Pour les utilisateurs ayant accès à l'interface administrateur, vous devez <b>configurer les permissions sur chaque object</b></br>(Note: les SUPER_ADMIN ont accès à tous les objects, pas besoin de configurer pour eux)</p>
<div class="btn-check-all btn btn-primary btn-sm checked">Tout cocher/décocher</div>
{% for roles_group in choices|batch(5) %}
{% set firstRole = roles_group|first %}
{% if 'ROLE_ADMIN_' in firstRole.label or 'ROLE_SONATA_USER_ADMIN_' in firstRole.label %}
{% set title = firstRole.label|split('ROLE_ADMIN_')|last|split('ROLE_SONATA_USER_ADMIN_')|last %}
{% set title = title|replace('_', ' ')|slice(0,-5) %}
{% set hidden = 'HIDDEN' in title %}
{% if title in ["GENERAL CONFIG", "ELEMENTS", "PROJECT"]%}<hr>{% endif %}
{% if not hidden %}
<div class="role-group object">
<div class="checkbox role-checkbox group-checkbox inline">
<label>
<i class="fa fa-check-circle btn-check-all-for-object"></i>
<span class="role-group-title btn-check-all-for-object">{{ title|capitalize }}</span>
</label>
</div>
{% for role in roles_group %}
{% set action = role.label|split('_')|last %}
<div class="checkbox role-checkbox inline">
<label>
<input type="checkbox" name="{{form.vars.full_name}}[]" value="{{role.value}}"
{% if role.value in object.roles %}checked{% endif %}>
<span class="control-label__text">{{ action }}</span>
</label>
</div>
{% endfor %}
</div>
{% endif %}
{% endif %}
{% endfor %}
</div>
</div>
<script>
$(document).ready(function() {
$('.btn-check-all-for-object').click(function() {
var checkboxes = $(this).closest('.role-group').find('input[type=checkbox]');
var value = !checkboxes.first().is(':checked');
$.each(checkboxes, function() {
$(this).prop('checked', value).trigger('change');
if (value) $(this).parent().addClass('checked');
else $(this).parent().removeClass('checked');
});
});
$('.btn-check-all').click(function() {
var value = $(this).hasClass('checked');
console.log("vakye", value);
$(this).toggleClass('checked', !value);
var checkboxes = $('.role-group.object input[type=checkbox]');
$.each(checkboxes, function() {
$(this).prop('checked', value).trigger('change');
if (value) $(this).parent().addClass('checked');
else $(this).parent().removeClass('checked');
});
});
checkForChanges();
});
function checkForChanges()
{
var show = $('.ROLE_SONATA_ADMIN .icheckbox_square-blue').hasClass('checked') && !$('.ROLE_SUPER_ADMIN .icheckbox_square-blue').hasClass('checked');
$('.admin-config').toggle(show);
setTimeout(checkForChanges, 200);
}
</script>
<style>
.role-group { margin-bottom: 15px; }
.role-group-title {
font-size: 18px;
color: #2b89c5;
margin-right: 15px;
font-weight: bold;
width: 200px;
display: inline-block;
}
.main-roles { margin-bottom: 20px; }
.role-checkbox {
margin-bottom: 15px;
margin-right: 20px;
}
.role-checkbox.inline { display: inline; }
.btn-check-all-for-object { font-size: 18px; margin-right: 10px; }
.btn-check-all { margin-bottom: 20px; }
.icheckbox_square-blue.disabled ~ .control-label__text { color: grey; }
</style>
{% endspaceless %}
{% endblock sonata_security_roles_widget %}
<?php
namespace Application\Sonata\UserBundle\Security;
use Sonata\AdminBundle\Security\Handler\RoleSecurityHandler as RoleSecurityHandler;
use Sonata\AdminBundle\Admin\AdminInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface;
class CustomRoleSecurityHandler implements SecurityHandlerInterface
{
/**
* @var AuthorizationCheckerInterface|SecurityContextInterface
*/
protected $authorizationChecker;
/**
* @var array
*/
protected $superAdminRoles;
/**
* NEXT_MAJOR: Go back to signature class check when bumping requirements to SF 2.6+.
*
* @param AuthorizationCheckerInterface|SecurityContextInterface $authorizationChecker
* @param array $superAdminRoles
*/
public function __construct($authorizationChecker, array $superAdminRoles)
{
if (!$authorizationChecker instanceof AuthorizationCheckerInterface && !$authorizationChecker instanceof SecurityContextInterface) {
throw new \InvalidArgumentException('Argument 1 should be an instance of Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface or Symfony\Component\Security\Core\SecurityContextInterface');
}
$this->authorizationChecker = $authorizationChecker;
$this->superAdminRoles = $superAdminRoles;
}
/**
* {@inheritdoc}
*/
public function isGranted(AdminInterface $admin, $attributes, $object = null)
{
if (!is_array($attributes)) {
$attributes = array($attributes);
}
$adminCode = $admin->getCode();
// use same permission for all option/categories objects
if (in_array($adminCode, ['admin.option_hidden', 'admin.option.lite_hidden', 'admin.categories.lite_hidden']))
$adminCode = 'admin.categories';
// give access to all hidden objects, like the images objects
if (strpos($adminCode, 'hidden')) return true;
foreach ($attributes as $pos => $attribute) {
$attributes[$pos] = sprintf($this->getBaseRole($admin, $adminCode), $attribute);
}
$allRole = sprintf($this->getBaseRole($admin, $adminCode), 'ALL');
try {
return $this->authorizationChecker->isGranted($this->superAdminRoles)
|| $this->authorizationChecker->isGranted($attributes, $object)
|| $this->authorizationChecker->isGranted(array($allRole), $object);
} catch (AuthenticationCredentialsNotFoundException $e) {
return false;
}
}
/**
* {@inheritdoc}
*/
public function getBaseRole(AdminInterface $admin, $adminCode = null)
{
if (!$adminCode) $adminCode = $admin->getCode();
return 'ROLE_'.str_replace('.', '_', strtoupper($adminCode)).'_%s';
}
/**
* {@inheritdoc}
*/
public function buildSecurityInformation(AdminInterface $admin)
{
return array();
}
/**
* {@inheritdoc}
*/
public function createObjectSecurity(AdminInterface $admin, $object)
{
}
/**
* {@inheritdoc}
*/
public function deleteObjectSecurity(AdminInterface $admin, $object)
{
}
}
\ No newline at end of file
......@@ -34,8 +34,8 @@ class ConfigurationContributionsAdmin extends ConfigurationAbstractAdmin
->add('deleteFeature','sonata_type_admin', $featureFormOption, $featureFormTypeOption)->end()
->with('Modération directe', $contributionStyle)
->add('directModerationFeature','sonata_type_admin', $featureFormOption, $featureFormTypeOption)->end()
->with('Modération collaborative (votes)', ['class' => 'col-md-6 col-lg-4 gogo-feature collaborative-feature'])
->add('collaborativeModerationFeature','sonata_type_admin', $featureFormOption, $featureFormTypeOption)->end()
->with('Modération collaborative (pouvoir voter)', ['class' => 'col-md-6 col-lg-4 gogo-feature collaborative-feature'])
->add('collaborativeModerationFeature','sonata_type_admin', $featureFormOption, $featureFormTypeOption)->end()
->with('Paramètres pour la modération collaborative' , array('class' => 'col-md-4 collaborative-moderation-box'))
->add('minVoteToChangeStatus', null, ['required'=>false, 'label' => "Nombre votes pour valider/refuser automatiquement"])
->add('maxOppositeVoteTolerated', null, ['required'=>false, 'label' => "Nombres maximum de vos contradictoires tolérés"])
......@@ -46,11 +46,11 @@ class ConfigurationContributionsAdmin extends ConfigurationAbstractAdmin
->with('Textes')
->add('collaborativeModerationExplanations', 'sonata_simple_formatter_type', array(
'format' => 'richhtml',
'label' => 'Explications au sujet de la modération collaborative',
'label' => 'Explications au sujet de la modération collaborative',
'ckeditor_context' => 'full',
'required' => false
))
->end()
->end()
;
}
}
\ No newline at end of file
......@@ -22,6 +22,6 @@ class FeatureConfigurationAdmin extends AbstractAdmin
->add('activeInIframe', null, ['required'=>false, 'label' => "Activé en Iframe"])
->add('allow_role_anonymous', null, ['required'=>false, 'label' => "Autoriser Anonymes"])
->add('allow_role_user', null, ['required'=>false, 'label' => "Autoriser Utilisateurs"])
->add('allow_role_admin', null, ['required'=>false, 'label' => "Autoriser Admin"]);
->add('allow_role_admin', null, ['required'=>false, 'label' => "Autoriser Modérateurs"]);
}
}
\ No newline at end of file
......@@ -42,7 +42,7 @@ class UserAdmin extends AbstractAdmin
->add('reportsCount', null, ['label' => 'Signalements'])
// ->add('enabled', null, array('editable' => true))
// ->add('locked', null, array('editable' => true))
->add('createdAt','date', array("format" => "d/m/Y"))
->add('createdAt','date', array("format" => "d/m/Y"))
;
......@@ -104,7 +104,7 @@ class UserAdmin extends AbstractAdmin
public function getUserManager()
{
return $this->userManager;
}
}
/**
* {@inheritdoc}
......@@ -116,7 +116,7 @@ class UserAdmin extends AbstractAdmin
->add('username')
->add('locked')
->add('newsletterFrequency', 'doctrine_mongo_callback', array(
'label' => 'Reception newsletter',
'label' => 'Reception newsletter',
'field_type' => 'checkbox',
'callback' => function($queryBuilder, $alias, $field, $value) {
if (!$value || !$value['value']) { return; }
......@@ -215,7 +215,7 @@ class UserAdmin extends AbstractAdmin
->add('enabled', null, array('required' => false))
->add('credentialsExpired', null, array('required' => false))
->end()
->with('Groups')
->with('Groups')
->add('groups', $modelType, array(
'required' => false,
'choices_as_values' => true,
......@@ -224,10 +224,10 @@ class UserAdmin extends AbstractAdmin
))
->end()
->end()
->tab('Security')
->tab('Security')
->with('Roles')
->add('realRoles', $securityRolesType, array(
'label' => 'form.label_roles',
'label' => false,
'expanded' => true,
'multiple' => true,
'required' => false,
......@@ -237,7 +237,7 @@ class UserAdmin extends AbstractAdmin
;
}
public function getTemplate($name)
public function getTemplate($name)
{
switch ($name) {
case 'list': return '@BiopenAdmin/list/list_user.html.twig';
......@@ -251,7 +251,7 @@ class UserAdmin extends AbstractAdmin
{
// $actions = parent::configureBatchActions($actions);
$actions = [];
$actions['sendMail'] = array(
'label' => 'Envoyer un mail',
'ask_confirmation' => false,
......
......@@ -39,7 +39,8 @@ class MigrationCommand extends GoGoAbstractCommand
// v2.3.1
"Vous pouvez maintenant renseigner la licence qui protège vos données dans Personnalisation -> Configuration Générale",
// v2.3.4
"Amélioration du système d'import: vous pouvez maintenant faire correspondre les champs et les catégories avant d'importer"
"Amélioration du <b>système d'import</b>: vous pouvez maintenant faire correspondre les champs et les catégories avant d'importer",
"La gestion des permissions des utilisateurs fait peau neuve ! Votre ancienne configuration ne sera <u>peut être plus valide</u>. Veuillez vous rendre dans le <b>menu Utilisateurs pour mettre à jour les roles des utilisateurs et des groupes</b> d'utilisateurs."
];
......
......@@ -46,7 +46,7 @@ class FeatureConfiguration
if (!$this->getActive() || !$this->getActiveInIframe() && $iframe) return false;
if (!$user) return $this->getAllowRoleAnonymous();
return $user->hasRole('ROLE_USER') && $this->getAllowRoleUser() ||
$user->hasRole('ROLE_ADMIN') && $this->getAllowRoleAdmin();
$user->isAdmin() && $this->getAllowRoleAdmin();
}
public function isOnlyAllowedForAdmin()
......
......@@ -20,11 +20,11 @@ abstract class NewsletterFrequencyOptions
{
const Never = 0;
const Weekly = 1;
const Monthly = 2;
const Monthly = 2;
}
/**
* @MongoDB\Document
* @MongoDB\HasLifecycleCallbacks
* @MongoDB\HasLifecycleCallbacks
* @MongoDB\Index(keys={"geo"="2d"})
* @MongoDB\Document(repositoryClass="Biopen\CoreBundle\Repository\UserRepository")
*/
......@@ -33,7 +33,7 @@ class User extends BaseUser
/**
* @MongoDB\Id(strategy="auto")
*/
protected $id;
protected $id;
/**
* Address of the user. Can be a simple postalCode, or a more precise address
......@@ -41,9 +41,9 @@ class User extends BaseUser
*/
protected $location;
/**
/**
* Geolocalisation of the location attribute
* @MongoDB\EmbedOne(targetDocument="Biopen\GeoDirectoryBundle\Document\Coordinates")
* @MongoDB\EmbedOne(targetDocument="Biopen\GeoDirectoryBundle\Document\Coordinates")
*/
public $geo;
......@@ -392,7 +392,7 @@ class User extends BaseUser
public function isAdmin()
{
return in_array("ROLE_ADMIN", $this->getRoles());
return in_array("ROLE_ADMIN", $this->getRoles()) || in_array("ROLE_SUPER_ADMIN", $this->getRoles());
}
public function hasRole($role)
......@@ -401,13 +401,13 @@ class User extends BaseUser
}
public function setGamification($value)
{
{
$this->gamification = $value;
return $this;
}
public function getGamification()
{
{
return $this->gamification;
}
......@@ -420,14 +420,14 @@ class User extends BaseUser
public function addReportsCount() { $this->votesCount++; }
public function addContributionCount() { $this->votesCount++; }
public function updateNextNewsletterDate()
public function updateNextNewsletterDate()
{
if ($this->getNewsletterFrequency() == 0) $this->setNextNewsletterDate(null);
else
{
switch ($this->getNewsletterFrequency())
else
{
switch ($this->getNewsletterFrequency())
{
case NewsletterFrequencyOptions::Weekly: $interval = new \DateInterval('P7D'); break;
case NewsletterFrequencyOptions::Weekly: $interval = new \DateInterval('P7D'); break;
case NewsletterFrequencyOptions::Monthly: $interval = new \DateInterval('P1M'); break;
}
$lastSent = clone $this->getLastNewsletterSentAt();
......@@ -612,8 +612,8 @@ class User extends BaseUser
{
// reset last newsletter sent at to now when user check to receive newsletter
if ($this->getNewsletterFrequency() == 0 && $newsletterFrequency > 0) $this->setLastNewsletterSentAt(new \DateTime());
$this->newsletterFrequency = $newsletterFrequency;
$this->updateNextNewsletterDate();
$this->newsletterFrequency = $newsletterFrequency;
$this->updateNextNewsletterDate();
return $this;
}
......
......@@ -2,32 +2,32 @@ services:
# --------- CONTENUS -----------
admin.wrapper:
admin.bandeaux_page_accueil:
class: Biopen\CoreBundle\Admin\WrapperAdmin
arguments: [~, Biopen\CoreBundle\Document\Wrapper, 'PixSortableBehaviorBundle:SortableAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: "Contenus", label: Bandeaux de la page d'accueil }
admin.partner:
admin.partenaires:
class: Biopen\CoreBundle\Admin\PartnerAdmin
arguments: [~, Biopen\CoreBundle\Document\Partner, 'PixSortableBehaviorBundle:SortableAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: "Contenus", label: Partenaires }
admin.about:
admin.popups_type_a_propos:
class: Biopen\CoreBundle\Admin\AboutAdmin
arguments: [~, Biopen\CoreBundle\Document\About, 'PixSortableBehaviorBundle:SortableAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: "Contenus", label: Popups type "A propos" }
- { name: sonata.admin, manager_type: doctrine_mongodb, group: "Contenus", label: Popups type "A propos" }
# --------- CONFIGURATION -----------
admin.config:
admin.general_config:
class: Biopen\CoreBundle\Admin\ConfigurationAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Configuration Générale }
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Configuration Générale }
admin.style_config:
class: Biopen\CoreBundle\Admin\ConfigurationStyleAdmin
......@@ -35,65 +35,55 @@ services:
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Style / Couleurs / Icones }
admin.home_config:
admin.accueil_config:
class: Biopen\CoreBundle\Admin\ConfigurationHomeAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Page d'Accueil }
admin.map_config:
admin.carte_config:
class: Biopen\CoreBundle\Admin\ConfigurationMapAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: La Carte }
admin.tile_layer:
admin.fonds_de_carte:
class: Biopen\CoreBundle\Admin\TileLayerAdmin
arguments: [~, Biopen\CoreBundle\Document\TileLayer, 'PixSortableBehaviorBundle:SortableAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Fonds de Carte }
admin.fiche_detail_config:
class: Biopen\CoreBundle\Admin\ConfigurationInfoBarAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: data_model, label: Fiche Détail }
admin.marker_config:
class: Biopen\CoreBundle\Admin\ConfigurationMarkerAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: custom, label: Marqueur / Popup }
admin.contributions_config:
class: Biopen\CoreBundle\Admin\ConfigurationContributionsAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: data_model, label: Qui peut Contribuer? }
- { name: sonata.admin, manager_type: doctrine_mongodb, group: data_model, label: Qui peut Contribuer? }
admin.form_config:
admin.formulaire_config:
class: Biopen\CoreBundle\Admin\ConfigurationFormAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: data_model, label: Formulaire }
admin.category:
class: Biopen\GeoDirectoryBundle\Admin\CategoryAdmin
arguments: [~, Biopen\GeoDirectoryBundle\Document\Category, 'BiopenGeoDirectoryBundle:Admin/CategoryAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: data_model, label: Catégories }
admin.map_element_form_config:
class: Biopen\CoreBundle\Admin\ConfigurationInfoBarAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: data_model, label: Fiche Détail }
admin.mail_config:
admin.email_config:
class: Biopen\CoreBundle\Admin\ConfigurationMailAdmin
arguments: [~, Biopen\CoreBundle\Document\Configuration, 'BiopenCoreBundle:ConfigurationAdmin']
tags:
- { name: sonata.admin, manager_type: doctrine_mongodb, group: emailing, label: Mails / Newsletter }
admin.stamps:
class: Biopen\GeoDirectoryBundle\Admin\StampAdmin
arguments: [~, Biopen\GeoDirectoryBundle\Document\Stamp, '' ]