Mercurial > libervia-backend
annotate libervia/backend/tools/trigger.py @ 4306:94e0968987cd
plugin XEP-0033: code modernisation, improve delivery, data validation:
- Code has been rewritten using Pydantic models and `async` coroutines for data validation
and cleaner element parsing/generation.
- Delivery has been completely rewritten. It now works even if server doesn't support
multicast, and send to local multicast service first. Delivering to local multicast
service first is due to bad support of XEP-0033 in server (notably Prosody which has an
incomplete implementation), and the current impossibility to detect if a sub-domain
service handles fully multicast or only for local domains. This is a workaround to have
a good balance between backward compatilibity and use of bandwith, and to make it work
with the incoming email gateway implementation (the gateway will only deliver to
entities of its own domain).
- disco feature checking now uses `async` corountines. `host` implementation still use
Deferred return values for compatibility with legacy code.
rel 450
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 26 Sep 2024 16:12:01 +0200 |
parents | 0d7bb4df2343 |
children |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
4 # SAT: a jabber client |
3479 | 5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
10 # (at your option) any later version. |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
15 # GNU Affero General Public License for more details. |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
20 """Misc usefull classes""" |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
22 import inspect |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
23 from typing import Callable |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
24 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
25 from libervia.backend.core.log import getLogger |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
26 from libervia.backend.core.core_types import SatXMPPEntity |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
27 |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
876
diff
changeset
|
28 log = getLogger(__name__) |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
741
diff
changeset
|
30 |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 class TriggerException(Exception): |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 pass |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
34 |
525
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
35 class SkipOtherTriggers(Exception): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
36 """Exception to raise if normal behaviour must be followed instead of following triggers list""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
37 |
525
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
38 pass |
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
39 |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
40 |
588
beaf6bec2fcd
Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
41 class TriggerManager(object): |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
42 """This class manage triggers: code which interact to change the behaviour of SàT""" |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 |
1347
ba41a81d14c2
frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
44 try: # FIXME: to be removed when a better solution is found |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
45 MIN_PRIORITY = float("-inf") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
46 MAX_PRIORITY = float("+inf") |
1347
ba41a81d14c2
frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
47 except: # XXX: Pyjamas will bug if you specify ValueError here |
ba41a81d14c2
frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
48 # Pyjamas uses the JS Float class |
ba41a81d14c2
frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
49 MIN_PRIORITY = Number.NEGATIVE_INFINITY |
ba41a81d14c2
frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
50 MAX_PRIORITY = Number.POSITIVE_INFINITY |
741
00318e60a06a
core (tools): set min and max priorities for triggers and warn if several triggers have the same not null priority
souliane <souliane@mailoo.org>
parents:
609
diff
changeset
|
51 |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 def __init__(self): |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
53 self.__triggers = {} |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
55 def is_available(self, args: list): |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
56 """Check if plugin used in a client context, and if it's available""" |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
57 if not args or not isinstance(args[0], SatXMPPEntity): |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
58 # we are not in the context of a client |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
59 return True |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
60 client = args[0] |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
61 if not client.is_component: |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
62 # plugins are always avaialble for normal clients |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
63 return True |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
64 |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
65 def add(self, point_name, callback: Callable, priority=0): |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 """Add a trigger to a point |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
67 |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 @param point_name: name of the point when the trigger should be run |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 @param callback: method to call at the trigger point |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
70 @param priority: callback will be called in priority order, biggest |
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
71 first |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 """ |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
73 if point_name not in self.__triggers: |
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
74 self.__triggers[point_name] = [] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
75 if priority != 0 and priority in [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
76 trigger_tuple[0] for trigger_tuple in self.__triggers[point_name] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
77 ]: |
876
65bf1bc70f6b
tools, plugin XEP-0077: small fixes
souliane <souliane@mailoo.org>
parents:
811
diff
changeset
|
78 if priority in (self.MIN_PRIORITY, self.MAX_PRIORITY): |
3028 | 79 log.warning(_("There is already a bound priority [%s]") % point_name) |
741
00318e60a06a
core (tools): set min and max priorities for triggers and warn if several triggers have the same not null priority
souliane <souliane@mailoo.org>
parents:
609
diff
changeset
|
80 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
81 log.debug( |
3028 | 82 _("There is already a trigger with the same priority [%s]") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
83 % point_name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
84 ) |
516
7ee15fbe8c08
core: added priority management in triggers
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
85 self.__triggers[point_name].append((priority, callback)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
86 self.__triggers[point_name].sort( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
87 key=lambda trigger_tuple: trigger_tuple[0], reverse=True |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
88 ) |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
90 def add_with_check( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
91 self, point_name: str, plugin, callback: Callable, priority: int = 0 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
92 ) -> None: |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
93 """Like [Add], but check session before running the trigger |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
94 |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
95 This method is to be used for triggers which can run in components and are |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
96 expecting a ``client``: as all plugins are not run for component, a check will be |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
97 added before running the trigger, if the plugin is not valid for this component, |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
98 the trigger is ignored. ``client`` must be the first positional argument. |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
99 |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
100 @param point_name: name of the trigger point |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
101 @param plugin: instance of the plugin using this trigger. This is necessary to |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
102 check if the plugin is available in the session. |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
103 @param callback: method to call at the trigger point |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
104 @param priority: callback will be called in priority order, biggest first |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
105 """ |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
106 if inspect.iscoroutinefunction(callback): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
107 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
108 async def async_wrapper(client: SatXMPPEntity, *args, **kwargs): |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
109 if client.is_component and plugin not in client.plugins: |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
110 log.debug(f"Ignoring {callback} as parent plugin is not available") |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
111 return True |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
112 else: |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
113 return await callback(client, *args, **kwargs) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
114 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
115 self.add(point_name, async_wrapper, priority) |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
116 else: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
117 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
118 def sync_wrapper(client: SatXMPPEntity, *args, **kwargs): |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
119 if client.is_component and plugin not in client.plugins: |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
120 log.debug(f"Ignoring {callback} as parent plugin is not available") |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
121 return True |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
122 else: |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
123 return callback(client, *args, **kwargs) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
124 |
4182
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
125 self.add(point_name, sync_wrapper, priority) |
4dc00e848961
core (tools/trigger): new `add_with_check` method:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
126 |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 def remove(self, point_name, callback): |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 """Remove a trigger from a point |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
129 |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 @param point_name: name of the point when the trigger should be run |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
131 @param callback: method to remove, must exists in the trigger point |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
132 """ |
516
7ee15fbe8c08
core: added priority management in triggers
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
133 for trigger_tuple in self.__triggers[point_name]: |
7ee15fbe8c08
core: added priority management in triggers
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
134 if trigger_tuple[1] == callback: |
7ee15fbe8c08
core: added priority management in triggers
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
135 self.__triggers[point_name].remove(trigger_tuple) |
7ee15fbe8c08
core: added priority management in triggers
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
136 return |
7ee15fbe8c08
core: added priority management in triggers
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
137 raise TriggerException("Trying to remove an unexisting trigger") |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 def point(self, point_name, *args, **kwargs): |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 """This put a trigger point |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
141 |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
142 All the triggers for that point will be run |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 @param point_name: name of the trigger point |
2650
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
144 @param *args: args to transmit to trigger |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
145 @param *kwargs: kwargs to transmit to trigger |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
146 if "triggers_no_cancel" is present, it will be popup out |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
147 when set to True, this argument don't let triggers stop |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
148 the workflow |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
149 @return: True if the action must be continued, False else |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
150 """ |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
151 if point_name not in self.__triggers: |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 return True |
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4182
diff
changeset
|
154 can_cancel = not kwargs.pop("triggers_no_cancel", False) |
2650
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
155 |
1347
ba41a81d14c2
frontends (QuickApp), tools (TriggerManager): frontends can also use triggers + add those for sending and receiving a message
souliane <souliane@mailoo.org>
parents:
993
diff
changeset
|
156 for priority, trigger in self.__triggers[point_name]: |
525
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
157 try: |
2650
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
158 if not trigger(*args, **kwargs) and can_cancel: |
525
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
159 return False |
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
160 except SkipOtherTriggers: |
5431136501ab
core: Triggers can now frobid other triggers execution
Goffi <goffi@goffi.org>
parents:
516
diff
changeset
|
161 break |
250
ad3b820651fa
Tools: new misc library, Trigger management implementation
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 return True |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
163 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
164 def return_point(self, point_name, *args, **kwargs): |
2499
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
165 """Like point but trigger must return (continue, return_value) |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
166 |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
167 All triggers for that point must return a tuple with 2 values: |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
168 - continue, same as for point, if False action must be finished |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
169 - return_value: value to return ONLY IF CONTINUE IS FALSE |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
170 @param point_name: name of the trigger point |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
171 @return: True if the action must be continued, False else |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
172 """ |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
173 |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
174 if point_name not in self.__triggers: |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
175 return True |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
176 |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
177 for priority, trigger in self.__triggers[point_name]: |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
178 try: |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
179 cont, ret_value = trigger(*args, **kwargs) |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
180 if not cont: |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
181 return False, ret_value |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
182 except SkipOtherTriggers: |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
183 break |
af4a38ebf52a
core (trigger): new returnPoint method:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
184 return True, None |