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