Added an admin page for the user groups.

This commit is contained in:
Jan Böhmer 2019-09-11 17:30:25 +02:00
parent 959e79b9fb
commit 856e20586f
6 changed files with 275 additions and 6 deletions

View file

@ -0,0 +1,119 @@
<?php
/**
*
* part-db version 0.1
* Copyright (C) 2005 Christoph Lechner
* http://www.cl-projects.de/
*
* part-db version 0.2+
* Copyright (C) 2009 K. Jacobs and others (see authors.php)
* http://code.google.com/p/part-db/
*
* Part-DB Version 0.4+
* Copyright (C) 2016 - 2019 Jan Böhmer
* https://github.com/jbtronics
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
namespace App\Controller;
use App\Controller\AdminPages\BaseAdminController;
use App\Entity\Parts\Category;
use App\Entity\UserSystem\Group;
use App\Form\AdminPages\CategoryAdminForm;
use App\Form\AdminPages\GroupAdminForm;
use App\Services\EntityExporter;
use App\Services\EntityImporter;
use App\Services\StructuralElementRecursionHelper;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* @Route("/group")
*/
class GroupController extends BaseAdminController
{
protected $entity_class = Group::class;
protected $twig_template = 'AdminPages/GroupAdmin.html.twig';
protected $form_class = GroupAdminForm::class;
protected $route_base = 'group';
/**
* @Route("/{id}/edit", requirements={"id"="\d+"}, name="group_edit")
* @Route("/{id}/", requirements={"id"="\d+"})
* @param Group $entity
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function edit(Group $entity, Request $request, EntityManagerInterface $em)
{
return $this->_edit($entity, $request, $em);
}
/**
* @Route("/new", name="group_new")
* @Route("/")
* @param Request $request
* @param EntityManagerInterface $em
* @param EntityImporter $importer
* @return Response
*/
public function new(Request $request, EntityManagerInterface $em, EntityImporter $importer)
{
return $this->_new($request, $em, $importer);
}
/**
* @Route("/{id}", name="group_delete", methods={"DELETE"})
* @param Request $request
* @param Group $entity
* @param StructuralElementRecursionHelper $recursionHelper
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function delete(Request $request, Group $entity, StructuralElementRecursionHelper $recursionHelper)
{
return $this->_delete($request, $entity, $recursionHelper);
}
/**
* @Route("/export", name="group_export_all")
* @param EntityManagerInterface $em
* @param EntityExporter $exporter
* @param Request $request
* @return Response
*/
public function exportAll(EntityManagerInterface $em, EntityExporter $exporter, Request $request)
{
return $this->_exportAll($em, $exporter, $request);
}
/**
* @Route("/{id}/export", name="group_export")
* @param Group $entity
* @param EntityExporter $exporter
* @param Request $request
* @return Response
*/
public function exportEntity(Group $entity, EntityExporter $exporter, Request $request)
{
return $this->_exportEntity($entity, $exporter, $request);
}
}

View file

@ -0,0 +1,49 @@
<?php
/**
*
* part-db version 0.1
* Copyright (C) 2005 Christoph Lechner
* http://www.cl-projects.de/
*
* part-db version 0.2+
* Copyright (C) 2009 K. Jacobs and others (see authors.php)
* http://code.google.com/p/part-db/
*
* Part-DB Version 0.4+
* Copyright (C) 2016 - 2019 Jan Böhmer
* https://github.com/jbtronics
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
namespace App\Form\AdminPages;
use App\Entity\Base\NamedDBElement;
use App\Form\Permissions\PermissionsType;
use Symfony\Component\Form\FormBuilderInterface;
class GroupAdminForm extends BaseEntityAdminForm
{
protected function additionalFormElements(FormBuilderInterface $builder, array $options, NamedDBElement $entity)
{
$builder->add('permissions', PermissionsType::class, [
'mapped' => false,
'data' => $builder->getData(),
'disabled' => !$this->security->isGranted('edit_permissions', $entity)
]);
}
}

View file

@ -0,0 +1,76 @@
<?php
/**
*
* part-db version 0.1
* Copyright (C) 2005 Christoph Lechner
* http://www.cl-projects.de/
*
* part-db version 0.2+
* Copyright (C) 2009 K. Jacobs and others (see authors.php)
* http://code.google.com/p/part-db/
*
* Part-DB Version 0.4+
* Copyright (C) 2016 - 2019 Jan Böhmer
* https://github.com/jbtronics
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
namespace App\Security\Voter;
use App\Entity\UserSystem\Group;
use App\Entity\UserSystem\User;
class GroupVoter extends ExtendedVoter
{
/**
* Similar to voteOnAttribute, but checking for the anonymous user is already done.
* The current user (or the anonymous user) is passed by $user.
*
* @param $attribute
* @param $subject
* @param User $user
*
* @return bool
*/
protected function voteOnUser($attribute, $subject, User $user): bool
{
if ($subject instanceof Group) {
return $this->resolver->inherit($user,'groups', $attribute) ?? false;
}
return false;
}
/**
* Determines if the attribute and subject are supported by this voter.
*
* @param string $attribute An attribute
* @param mixed $subject The subject to secure, e.g. an object the user wants to access or any other PHP type
*
* @return bool True if the attribute and subject are supported, false otherwise
*/
protected function supports($attribute, $subject)
{
if ($subject instanceof Group) {
return $this->resolver->isValidOperation('groups', $attribute);
}
return false;
}
}

View file

@ -42,6 +42,7 @@ use App\Entity\Parts\Part;
use App\Entity\Parts\Storelocation; use App\Entity\Parts\Storelocation;
use App\Entity\Parts\Supplier; use App\Entity\Parts\Supplier;
use App\Entity\PriceInformations\Currency; use App\Entity\PriceInformations\Currency;
use App\Entity\UserSystem\Group;
use App\Entity\UserSystem\User; use App\Entity\UserSystem\User;
use App\Exceptions\EntityNotSupported; use App\Exceptions\EntityNotSupported;
use Symfony\Component\HttpKernel\HttpCache\Store; use Symfony\Component\HttpKernel\HttpCache\Store;
@ -196,7 +197,8 @@ class EntityURLGenerator
Footprint::class => 'footprint_edit', Footprint::class => 'footprint_edit',
User::class => 'user_edit', User::class => 'user_edit',
Currency::class => 'currency_edit', Currency::class => 'currency_edit',
MeasurementUnit::class => 'measurement_unit_edit' MeasurementUnit::class => 'measurement_unit_edit',
Group::class => 'group_edit'
]; ];
return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]);
@ -222,7 +224,8 @@ class EntityURLGenerator
Footprint::class => 'footprint_new', Footprint::class => 'footprint_new',
User::class => 'user_new', User::class => 'user_new',
Currency::class => 'currency_new', Currency::class => 'currency_new',
MeasurementUnit::class => 'measurement_unit_new' MeasurementUnit::class => 'measurement_unit_new',
Group::class => 'group_new'
]; ];
return $this->urlGenerator->generate($this->mapToController($map, $entity)); return $this->urlGenerator->generate($this->mapToController($map, $entity));
@ -278,7 +281,8 @@ class EntityURLGenerator
Footprint::class => 'footprint_delete', Footprint::class => 'footprint_delete',
User::class => 'user_delete', User::class => 'user_delete',
Currency::class => 'currency_delete', Currency::class => 'currency_delete',
MeasurementUnit::class => 'measurement_unit_delete' MeasurementUnit::class => 'measurement_unit_delete',
Group::class => 'group_delete'
]; ];
return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]);

View file

@ -136,12 +136,16 @@ class ToolsTreeBuilder
*/ */
protected function getSystemNodes() : array protected function getSystemNodes() : array
{ {
$edit_nodes = array(); $nodes = array();
$edit_nodes[] = new TreeViewNode($this->translator->trans('tree.tools.system.users'), $nodes[] = new TreeViewNode($this->translator->trans('tree.tools.system.users'),
$this->urlGenerator->generate("user_new") $this->urlGenerator->generate("user_new")
); );
return $edit_nodes; $nodes[] = new TreeViewNode($this->translator->trans('tree.tools.system.groups'),
$this->urlGenerator->generate('group_new')
);
return $nodes;
} }
} }

View file

@ -0,0 +1,17 @@
{% extends "AdminPages/EntityAdminBase.html.twig" %}
{% block card_title %}
<i class="fas fa-users fa-fw"></i> {% trans %}group.edit.caption{% endtrans %}
{% endblock %}
{% block additional_pills %}
<li class="nav-item"><a data-toggle="tab" class="nav-link link-anchor" href="#tab_permissions">{% trans %}user.edit.permissions{% endtrans %}</a></li>
{% endblock %}
{% block additional_panes %}
<div class="tab-pane" id="tab_permissions">
{{ form_row(form.permissions) }}
</div>
{% endblock %}