-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Business rule for assets : action to add a group in charge now supports multiple groups. (11/bf) #21668
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 11.0/bugfixes
Are you sure you want to change the base?
Conversation
|
Shouldn't the action for "Group" be changed in addition to "Group in charge"? |
good question. And, you are right, we can also add the possibility to add multiple groups for |
Yes. It is just the default/regular group association type.
The only issue I forsee is confusion around the |
|
|
cedric-anne
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The append action seems to remove the existing groups, instead of appending new groups to existing groups.
|
ok, I'll check by adding a test. |
This was the case. I added a test then fix the code. |
|
(sorry for the merge, I resolved the conflict in GitHub) |
9e9c7ef to
7afb679
Compare
cedric-anne
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is still an issue. Existing values are correctly preserved, but if I tried to manually add a group in the form, it is dropped when the "append" rule is executed.
96b6ae6 to
93a0131
Compare
AdrienClairembault
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
E2E failure is related, I reproduce it with make cypress c="--spec tests/cypress/e2e/form/destination_config_fields/requester.cy.js"
The 500 error from the server logs:
[2025-11-14 08:49:37] glpi.CRITICAL: *** Uncaught PHP Exception TypeError: "array_merge(): Argument #2 must be of type array, int given" at CommonDBTM.php line 5776
Backtrace :
./src/CommonDBTM.php:5776
./src/CommonDBTM.php:5776 array_merge()
./src/CommonDBTM.php:1353 CommonDBTM->assetBusinessRules()
./src/Glpi/Api/API.php:1894 CommonDBTM->add()
./src/Glpi/Api/APIRest.php:344 Glpi\Api\API->createItems()
./src/Glpi/Controller/ApiRestController.php:59 Glpi\Api\APIRest->call()
./vendor/symfony/http-kernel/HttpKernel.php:101 Glpi\Controller\ApiRestController->{closure:Glpi\Controller\ApiRestController::__invoke():57}()
...ymfony/http-foundation/StreamedResponse.php:106 Symfony\Component\HttpKernel\HttpKernel::{closure:Symfony\Component\HttpKernel\HttpKernel::handle():98}()
./vendor/symfony/http-foundation/Response.php:423 Symfony\Component\HttpFoundation\StreamedResponse->sendContent()
./src/Glpi/Kernel/Kernel.php:295 Symfony\Component\HttpFoundation\Response->send()
./public/index.php:72 Glpi\Kernel\Kernel->sendResponse()
It seems to be this API payload that trigger the errors:
I think you missed that groups_id can be an int instead of an array (as this API call work properly and set the correct groups on the bugfixes branch).
|
Given the number of unexpected issues that have been found (and the fact that this is a new feature), I think it would be safer to target the main branch instead. |
A (cypress?) test is missing probably. I agree, it's a feature more than a bugfix. |
replace $this->assertEmpty() by $this->assertEquals([]
…ts multiple groups.
…stead of an array of int
… of an array of int
Co-authored-by: Johan Cwiklinski <trasher@x-tnd.be>
Co-authored-by: Adrien Clairembault <42734840+AdrienClairembault@users.noreply.github.com>
Not sure how this can happen, but it does...
5e3af5b to
20a9d11
Compare
cedric-anne
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we are able to move the required changes in the rules class, without having to change too much the API and the CommonDBTM code, it could be OK to include this change in GLPI 11.
| //add current item | ||
| $message = ''; | ||
| try { | ||
| $item->fields = []; // reset fields which can be set by $item->can(), avoid side effects |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it must be fixed somewhere else. Indeed, there are probably many places where the if ($item->can($id, CREATE, $input)) { $item->add($input); } chaining is done. It should not trigger issues.
| if (is_array($value) && $value !== []) { | ||
| // determine $preserve_user_input by processing the first item, the value is the same on each entry | ||
| // but just in case this is not the case anymore a check is processed | ||
| // value can be an array if multiples values are set and can be an array because of appendtoarray & appendtoarrayfield are defined in action (for group fields, _groups_id , _groups_id_tech) | ||
| // @see \RuleAsset::getActions() | ||
| $_rule_action_field_exists = array_reduce( | ||
| $value, | ||
| static fn($result, $v) => $result && is_array($v) && array_key_exists('_rule_action', $v), | ||
| true | ||
| ); | ||
| if ($_rule_action_field_exists) { | ||
|
|
||
| $preserve_user_input = $value[0]['_rule_action'] === 'append'; | ||
| if ($preserve_user_input && !isset($existing_data[$field])) { | ||
| throw new LogicException('Implemetation error: action was defined with appendtoarray but the value not backed up before rule processing'); | ||
| } | ||
| // use value before rule processing | ||
| $this->input[$field] = $preserve_user_input ? $existing_data[$field] : []; | ||
| foreach ($value as $_value) { | ||
| $this->input[$field][] = $_value[$field]; | ||
| } | ||
| $value_processed = true; | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If possible , the related logic should be located in the rules classes. However, I do not know where the logic used for ticket actors is located.

Checklist before requesting a review
Please delete options that are not relevant.
Description