From: Johan Cwiklinski Date: Mon, 4 Oct 2021 04:37:35 +0000 (+0200) Subject: Create member from parent X-Git-Tag: 0.9.5.1~45 X-Git-Url: https://git.agnieray.net/?a=commitdiff_plain;h=0aa3fa9de2930b21da25982d7eb9e0a6685d57ed;p=galette.git Create member from parent --- diff --git a/galette/includes/core_acls.php b/galette/includes/core_acls.php index 89f6f3cb2..2090faec5 100644 --- a/galette/includes/core_acls.php +++ b/galette/includes/core_acls.php @@ -68,6 +68,7 @@ $core_acls = [ 'member' => 'member', 'pdf-members-cards' => 'member', 'editMember' => 'member', + 'addMemberChild' => 'member', //most of members routes are accessible to groups manager, including mass changes pages '/(.+)?member(.+)?/i' => 'groupmanager', 'ajaxGroupMembers' => 'staff', diff --git a/galette/includes/routes/members.routes.php b/galette/includes/routes/members.routes.php index d6c5e7b40..0c8567402 100644 --- a/galette/includes/routes/members.routes.php +++ b/galette/includes/routes/members.routes.php @@ -88,6 +88,11 @@ $app->get( [Crud\MembersController::class, 'add'] )->setName('addMember')->add($authenticate)->add(MembersNavigate::class); +$app->get( + '/member/add/child', + [Crud\MembersController::class, 'addChild'] +)->setName('addMemberChild')->add($authenticate); + $app->post( '/subscribe/store', [Crud\MembersController::class, 'doSelfSubscribe'] diff --git a/galette/lib/Galette/Controllers/Crud/MembersController.php b/galette/lib/Galette/Controllers/Crud/MembersController.php index 998c7b659..50d1c0840 100644 --- a/galette/lib/Galette/Controllers/Crud/MembersController.php +++ b/galette/lib/Galette/Controllers/Crud/MembersController.php @@ -95,6 +95,19 @@ class MembersController extends CrudController return $this->edit($request, $response, null, 'add'); } + /** + * Add child page + * + * @param Request $request PSR Request + * @param Response $response PSR Response + * + * @return Response + */ + public function addChild(Request $request, Response $response): Response + { + return $this->edit($request, $response, null, 'addchild'); + } + /** * Self subscription page * @@ -1083,29 +1096,41 @@ class MembersController extends CrudController //retrieve from session, in add or edit $member = $this->session->member; $this->session->member = null; - } elseif ($id !== null) { + $id = $member->id; + } + + if ($id !== null) { //load requested member $member->load($id); - if (!$member->canEdit($this->login)) { - $this->flash->addMessage( - 'error_detected', - _T("You do not have permission for requested URL.") + $can = $member->canEdit($this->login); + } else { + $can = $member->canCreate($this->login); + } + + if (!$can) { + $this->flash->addMessage( + 'error_detected', + _T("You do not have permission for requested URL.") + ); + + return $response + ->withStatus(403) + ->withHeader( + 'Location', + $this->router->pathFor('me') ); + } - return $response - ->withStatus(403) - ->withHeader( - 'Location', - $this->router->pathFor('me') - ); - } + //if adding a child, force parent here + if ($action === 'addchild') { + $member->setParent((int)$this->login->id); } // flagging required fields $fc = $this->fields_config; // password required if we create a new member - if ($member->id != '') { + if ($id === null) { $fc->setNotRequired('mdp_adh'); } @@ -1144,18 +1169,18 @@ class MembersController extends CrudController $form_elements = $fc->getFormElements( $this->login, - $member->id == '' + $id === null ); // members $m = new Members(); - $id = null; + $pid = null; if ($member->hasParent()) { - $id = ($member->parent instanceof Adherent ? $member->parent->id : $member->parent); + $pid = ($member->parent instanceof Adherent ? $member->parent->id : $member->parent); } $members = $m->getSelectizedMembers( $this->zdb, - $id + $pid ); $route_params['members'] = [ @@ -1184,7 +1209,8 @@ class MembersController extends CrudController 'groups' => $groups_list, 'fieldsets' => $form_elements['fieldsets'], 'hidden_elements' => $form_elements['hiddens'], - 'parent_fields' => $tpl_parent_fields + 'parent_fields' => $tpl_parent_fields, + 'addchild' => ($action === 'addchild') ) + $route_params ); return $response; diff --git a/galette/lib/Galette/Core/Preferences.php b/galette/lib/Galette/Core/Preferences.php index f85acfe3b..461a7d3e3 100644 --- a/galette/lib/Galette/Core/Preferences.php +++ b/galette/lib/Galette/Core/Preferences.php @@ -38,7 +38,6 @@ namespace Galette\Core; use Galette\Entity\PaymentType; use Throwable; use Analog\Analog; -use Galette\Core\Galette; use Galette\Entity\Adherent; use Galette\Entity\Status; use Galette\IO\PdfMembersCards; @@ -275,7 +274,8 @@ class Preferences 'pref_password_length' => 6, 'pref_password_blacklist' => false, 'pref_password_strength' => self::PWD_NONE, - 'pref_default_paymenttype' => PaymentType::CHECK + 'pref_default_paymenttype' => PaymentType::CHECK, + 'pref_bool_create_member' => false ); // flagging required fields diff --git a/galette/lib/Galette/Entity/Adherent.php b/galette/lib/Galette/Entity/Adherent.php index 387932983..fca63ec93 100644 --- a/galette/lib/Galette/Entity/Adherent.php +++ b/galette/lib/Galette/Entity/Adherent.php @@ -2039,7 +2039,27 @@ class Adherent } /** - * Can current logged in user edit member + * Can current logged-in user create member + * + * @param Login $login Login instance + * + * @return boolean + */ + public function canCreate(Login $login) + { + global $preferences; + + if ($this->id && $login->id == $this->id || $login->isAdmin() || $login->isStaff()) { + return true; + } + + if ($preferences->pref_bool_create_member && $login->isLogged()) { + return true; + } + } + + /** + * Can current logged-in user edit member * * @param Login $login Login instance * @@ -2113,4 +2133,18 @@ class Adherent { return $this->sendmail; } + + /** + * Set member parent + * + * @param integer $id Parent identifier + * + * @return $this + */ + public function setParent(int $id): self + { + $this->_parent = $id; + $this->loadParent(); + return $this; + } } diff --git a/galette/templates/default/member.tpl b/galette/templates/default/member.tpl index 862287d64..85d29618f 100644 --- a/galette/templates/default/member.tpl +++ b/galette/templates/default/member.tpl @@ -21,9 +21,9 @@
{if $member->hasParent() && !$member->isDuplicate()} {_T string="Attached to:"} - $member->parent->id]}">{$member->parent->sfullname}
- {if $login->isAdmin() or $login->isStaff() or $login->id eq $member->parent->id} - + $member->parent->id]}">{$member->parent->sfullname} + {if $login->isAdmin() or $login->isStaff() && (!isset($addchild) || !$addchild)} +
{/if} {else if ($login->isAdmin() or $login->isStaff()) and !$member->hasChildren() and isset($members.list)} @@ -45,7 +45,6 @@ {foreach from=$member->children item=child} $child->id]}">{$child->sfullname}{if not $child@last}, {/if} {/foreach} - {/if}
{/if} diff --git a/galette/templates/default/page.tpl b/galette/templates/default/page.tpl index 93021cab8..eeb39221c 100644 --- a/galette/templates/default/page.tpl +++ b/galette/templates/default/page.tpl @@ -34,6 +34,9 @@ We have to use a template file, so Smarty will do its work (like replacing varia

{_T string="Navigation"}