3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
6 * Galette groups controller
10 * Copyright © 2020-2023 The Galette Team
12 * This file is part of Galette (http://galette.tuxfamily.org).
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
27 * @category Controllers
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020-2023 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since Available since 0.9.4dev - 2020-05-06
37 namespace Galette\Controllers\Crud
;
40 use Galette\Controllers\CrudController
;
41 use Slim\Psr7\Request
;
42 use Slim\Psr7\Response
;
43 use Galette\Entity\Adherent
;
44 use Galette\Entity\Group
;
45 use Galette\Repository\Groups
;
46 use Galette\Repository\Members
;
50 * Galette groups controller
52 * @category Controllers
53 * @name GroupsController
55 * @author Johan Cwiklinski <johan@x-tnd.be>
56 * @copyright 2020-2023 The Galette Team
57 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
58 * @link http://galette.tuxfamily.org
59 * @since Available since 0.9.4dev - 2020-05-06
62 class GroupsController
extends CrudController
69 * @param Request $request PSR Request
70 * @param Response $response PSR Response
74 public function add(Request
$request, Response
$response): Response
76 //no new page (included on list), just to satisfy inheritance
83 * @param Request $request PSR Request
84 * @param Response $response PSR Response
85 * @param string $name Group name
89 public function doAdd(Request
$request, Response
$response, string $name = null): Response
92 $group->setLogin($this->login
);
93 $group->setName($name);
95 if (!$this->login
->isSuperAdmin()) {
96 $group->setManagers(new Adherent($this->zdb
, $this->login
->id
));
98 $id = $group->getId();
102 ->withHeader('Location', $this->routeparser
->urlFor('groups', ['id' => $id]));
109 * @param Request $request PSR Request
110 * @param Response $response PSR Response
114 public function checkUniqueness(Request
$request, Response
$response): Response
116 $post = $request->getParsedBody();
117 if (!isset($post['gname']) ||
$post['gname'] == '') {
119 'Trying to check if group name is unique without name specified',
122 return $this->withJson(
126 'message' => htmlentities(_T("Group name is missing!"))
130 return $this->withJson(
133 'success' => Groups
::isUnique($this->zdb
, $post['gname'])
145 * @param Request $request PSR Request
146 * @param Response $response PSR Response
147 * @param string $option One of 'page' or 'order'
148 * @param string|integer $value Value of the option
149 * @param integer $id Member id to check rights
153 public function list(Request
$request, Response
$response, $option = null, $value = null, $id = null): Response
155 $groups = new Groups($this->zdb
, $this->login
);
156 $group = new Group();
157 $group->setLogin($this->login
);
159 $groups_root = $groups->getList(false);
160 $groups_list = $groups->getList();
163 if ($this->login
->isGroupManager($id)) {
167 'Trying to display group ' . $id . ' without appropriate permissions',
170 return $response->withStatus(403);
174 if ($id === null && count($groups_list) > 0) {
175 $group = current($groups_list);
176 if (!$this->login
->isGroupManager($id)) {
177 foreach ($groups_list as $g) {
178 if ($this->login
->isGroupManager($g->getId())) {
187 foreach ($groups_list as $parent_group) {
188 if ($group->canSetParentGroup($parent_group)) {
189 $parent_groups[] = $parent_group;
194 $tab = $request->getQueryParams
['tab'] ??
'group_information';
199 'pages/groups_list.html.twig',
201 'page_title' => _T("Groups"),
202 'groups_root' => $groups_root,
203 'parent_groups' => $parent_groups,
214 * @param Request $request PSR Request
215 * @param Response $response PSR Response
219 public function getGroup(Request
$request, Response
$response): Response
221 $post = $request->getParsedBody();
222 $id = $post['id_group'];
223 $group = new Group((int)$id);
224 if (!$group->canEdit($this->login
)) {
225 throw new \
RuntimeException('Trying to edit group without appropriate permissions');
228 $groups = new Groups($this->zdb
, $this->login
);
233 'elements/group.html.twig',
236 'groups' => $groups->getList(),
244 * Groups list page for ajax calls
246 * @param Request $request PSR Request
247 * @param Response $response PSR Response
251 public function simpleList(Request
$request, Response
$response): Response
253 $post = $request->getParsedBody();
255 $groups = new Groups($this->zdb
, $this->login
);
260 'elements/ajax_groups.html.twig',
263 'groups_list' => $groups->getList(),
264 'selected_groups' => (isset($post['groups']) ?
$post['groups'] : [])
271 * Groups list page for ajax calls
273 * @param Request $request PSR Request
274 * @param Response $response PSR Response
278 public function ajaxMembers(Request
$request, Response
$response): Response
280 $post = $request->getParsedBody();
282 $ids = $post['persons'];
283 $mode = $post['person_mode'];
285 if (!$ids ||
!$mode) {
287 'Missing persons and mode for ajaxGroupMembers',
294 $persons = $m->getArrayList($ids);
299 'elements/group_persons.html.twig',
301 'persons' => $persons,
302 'person_mode' => $mode
311 * @param Request $request PSR Request
312 * @param Response $response PSR Response
316 public function filter(Request
$request, Response
$response): Response
328 * @param Request $request PSR Request
329 * @param Response $response PSR Response
330 * @param integer $id Record id
334 public function edit(Request
$request, Response
$response, int $id): Response
336 //no edit page (included on list), just to satisfy inheritance
343 * @param Request $request PSR Request
344 * @param Response $response PSR Response
345 * @param integer $id Group id
349 public function doEdit(Request
$request, Response
$response, int $id): Response
351 $post = $request->getParsedBody();
352 $group = new Group($id);
353 if (!$group->canEdit($this->login
)) {
354 throw new \
RuntimeException('Trying to edit group without appropriate permissions');
357 $group->setName($post['group_name']);
359 if ($post['parent_group'] !== '') {
360 $group->setParentGroup((int)$post['parent_group']);
367 //handle group managers
368 if (isset($post['managers'])) {
369 $managers_id = $post['managers'];
370 $managers = $m->getArrayList($managers_id);
371 $group->setManagers($managers);
374 //handle group members
375 if (isset($post['members'])) {
376 $members_id = $post['members'];
377 $members = $m->getArrayList($members_id);
378 $group->setMembers($members);
381 $store = $group->store();
382 if ($store === true) {
383 $this->flash
->addMessage(
388 _T("Group `%groupname` has been successfully saved.")
392 //something went wrong :'(
393 $this->flash
->addMessage(
395 _T("An error occurred while storing the group.")
398 } catch (Throwable
$e) {
399 $this->flash
->addMessage(
405 if (isset($post['tab']) && $post['tab'] != 'general') {
406 $tab = '?tab=' . $post['tab'];
412 ->withHeader('Location', $this->routeparser
->urlFor('groups', ['id' => $group->getId()]) . $tab);
418 * @param Request $request PSR Request
419 * @param Response $response PSR Response
423 public function reorder(Request
$request, Response
$response): Response
426 !$this->login
->isAdmin()
427 && !$this->login
->isStaff()
428 && !($this->login
->isGroupManager() && $this->preferences
->pref_bool_groupsmanagers_edit_groups
)
430 throw new \
RuntimeException('Trying to reorder groups without appropriate permissions');
433 $post = $request->getParsedBody();
434 if (!isset($post['to']) ||
!isset($post['id_group']) ||
$post['id_group'] == '') {
436 'Trying to reorder without required parameters!',
441 $id = $post['id_group'];
442 $group = new Group((int)$id);
443 if (!empty($post['to'])) {
444 $group->setParentGroup((int)$post['to']);
448 $result = $group->store();
451 return $this->withJson(
463 * Get redirection URI
465 * @param array $args Route arguments
469 public function redirectUri(array $args)
471 return $this->routeparser
->urlFor('groups');
477 * @param array $args Route arguments
481 public function formUri(array $args)
483 return $this->routeparser
->urlFor(
485 ['id' => (int)$args['id']]
490 * Get confirmation removal page title
492 * @param array $args Route arguments
496 public function confirmRemoveTitle(array $args)
498 $group = new Group((int)$args['id']);
500 _T('Remove group %1$s'),
501 $group->getFullName()
508 * @param array $args Route arguments
509 * @param array $post POST values
513 protected function doDelete(array $args, array $post)
515 $group = new Group((int)$post['id']);
516 $group->setLogin($this->login
);
517 $cascade = isset($post['cascade']);
518 $is_deleted = $group->remove($cascade);
520 if ($is_deleted !== true && $group->isEmpty() === false) {
521 $this->flash
->addMessage(
523 _T("Group is not empty, it cannot be deleted. Use cascade delete instead.")
531 * Removal confirmation parameters, can be overriden
533 * @param Request $request PSR Request
537 protected function getconfirmDeleteParams(Request
$request): array
539 return parent
::getconfirmDeleteParams($request) +
['with_cascade' => true];