Bug 41684

Summary: notices_content hook is not checking if individual plugins are enabled and is reloading plugins
Product: Koha Reporter: Nick Clemens (kidclamp) <nick>
Component: Plugin architectureAssignee: Tomás Cohen Arazi (tcohen) <tomascohen>
Status: Pushed to main --- QA Contact: Martin Renvoize (ashimema) <martin.renvoize>
Severity: major    
Priority: P5 - low CC: Chip.Halvorsen, martin.renvoize, nick, tomascohen
Version: Main   
Hardware: All   
OS: All   
See Also: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=38384
GIT URL: Initiative type: ---
Sponsorship status: --- Comma delimited list of Sponsors:
Crowdfunding goal: 0 Crowdfunding committed: 0
Crowdfunding contact: Patch complexity: Trivial patch
Documentation contact: Documentation submission:
Text to go in the release notes:
Version(s) released in:
26.05.00
Circulation function:
Attachments: Bug 41684: Make `notices_content` hook be used with `get_enabled_plugins()`
Bug 41684: Make `notices_content` hook be used with `get_enabled_plugins()`
Bug 41684: Make `notices_content` hook be used with `get_enabled_plugins()`

Description Nick Clemens (kidclamp) 2026-01-22 12:43:26 UTC
Bug 39870 added a new hook 'notices_content'

When searching for plugins, however, this hook does not check whether the plugin is enabled or not

Additionally, since not using Koha::Plugins->call or get_enabled_plugins, this is loading the plugin code again and breaking transactions as we have done in other places.
Comment 1 Tomás Cohen Arazi (tcohen) 2026-01-22 19:24:12 UTC
Created attachment 191885 [details] [review]
Bug 41684: Make `notices_content` hook be used with `get_enabled_plugins()`

This patch makes the plugin hook load plugins using `get_enabled_plugins()`. This has
the immediate effect of using the already cached plugin objects without reinstantiating them.

This way transactions don't get broken for schema reloads. Also, only enabled plugins
are loaded/attempted to be loaded.

To test:
1. Run:
   $ ktd --shell
  k$ prove t/db_dependent/Koha/Plugins/Notices_content_hook.t
=> SUCCESS: Tests pass
2. Apply this patch
3. Repeat 1
=> SUCCESS: Tests still pass: fundamental behavior remains unchanged.
4. Sign off :-D

Signed-off-by: Tomás Cohen Arazi <tomascohen@theke.io>
Comment 2 David Nind 2026-01-23 04:38:44 UTC
Created attachment 191892 [details] [review]
Bug 41684: Make `notices_content` hook be used with `get_enabled_plugins()`

This patch makes the plugin hook load plugins using `get_enabled_plugins()`. This has
the immediate effect of using the already cached plugin objects without reinstantiating them.

This way transactions don't get broken for schema reloads. Also, only enabled plugins
are loaded/attempted to be loaded.

To test:
1. Run:
   $ ktd --shell
  k$ prove t/db_dependent/Koha/Plugins/Notices_content_hook.t
=> SUCCESS: Tests pass
2. Apply this patch
3. Repeat 1
=> SUCCESS: Tests still pass: fundamental behavior remains unchanged.
4. Sign off :-D

Signed-off-by: Tomás Cohen Arazi <tomascohen@theke.io>
Signed-off-by: David Nind <david@davidnind.com>
Comment 3 Nick Clemens (kidclamp) 2026-01-26 14:02:25 UTC
This only worked for me after apply bug 38384

Without that additional set, I still received db locks

To test:
1 - Install Rapido plugin
2 - Disable Rapido plugin
3 - Add a notice with code HOLD_CANCELLATION - add title and content to email transport and save
4 - Place several holds for patrons with email addresses
5 - In the DB:
    UPDATE reserves SET reservedate='2025-01-01'
6 - On command line:
    perl misc/cronjobs/holds/cancel_unfilled_holds.pl -d 35 -v -c -r unfilled
7 - The first one often succeeed, but then second locks
8 - Apply patch
9 - Clean any partial cancelled holds:
    DELETE FROM old_reserves; 
10 - Repeat 6
11 - Still freezes
12 - Repeat 9
13 - Apply 38384
14 - Repeat 6
15 - Success!
Comment 4 Martin Renvoize (ashimema) 2026-02-02 18:03:47 UTC
Created attachment 192338 [details] [review]
Bug 41684: Make `notices_content` hook be used with `get_enabled_plugins()`

This patch makes the plugin hook load plugins using `get_enabled_plugins()`. This has
the immediate effect of using the already cached plugin objects without reinstantiating them.

This way transactions don't get broken for schema reloads. Also, only enabled plugins
are loaded/attempted to be loaded.

To test:
1. Run:
   $ ktd --shell
  k$ prove t/db_dependent/Koha/Plugins/Notices_content_hook.t
=> SUCCESS: Tests pass
2. Apply this patch
3. Repeat 1
=> SUCCESS: Tests still pass: fundamental behavior remains unchanged.
4. Sign off :-D

Signed-off-by: Tomás Cohen Arazi <tomascohen@theke.io>
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Comment 5 Lucas Gass (lukeg) 2026-02-06 22:22:02 UTC
Nice work everyone!

Pushed to main for 26.05